home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / 3Dmodeling / vect3d.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  3.5 KB  |  181 lines

  1. /*
  2.  * Copyright 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17.  
  18. /* Routines to manipulate 3 dimensional vectors.  All these routines
  19.  * should work even if the input and output vectors are the same.
  20.  *
  21.  *  -- Tom Davis 1990
  22.  *
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <math.h>
  27. #include "3d.h"
  28.  
  29. void (*errfunc)(char *) = 0;
  30.  
  31. void seterrorfunc(void (*func)(char *))
  32. {
  33.     errfunc = func;
  34. }
  35.  
  36. void error(char *s)
  37. {
  38.     if (errfunc)
  39.     (*errfunc)(s);
  40.     else {
  41.     fprintf(stderr, s); 
  42.     fprintf(stderr, "\n");
  43.     exit(1);
  44.     }
  45. }
  46.  
  47. void diff3(float p[3], float q[3], float diff[3])
  48. {
  49.     diff[0] = p[0] - q[0];
  50.     diff[1] = p[1] - q[1];
  51.     diff[2] = p[2] - q[2];
  52. }
  53.  
  54. void add3(float p[3], float q[3], float sum[3])
  55. {
  56.     sum[0] = p[0] + q[0];
  57.     sum[1] = p[1] + q[1];
  58.     sum[2] = p[2] + q[2];
  59. }
  60.  
  61. void scalarmult(float s, float v[3], float vout[3])
  62. {
  63.     vout[0] = v[0]*s;
  64.     vout[1] = v[1]*s;
  65.     vout[2] = v[2]*s;
  66. }
  67.  
  68. float dot3(float p[3], float q[3])
  69. {
  70.     return p[0]*q[0] + p[1]*q[1] + p[2]*q[2];
  71. }
  72.  
  73. float length3(float v[3])
  74. {
  75.     return sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
  76. }
  77.  
  78. float dist3(float p[3], float q[3])
  79. {
  80.     float d[3];
  81.  
  82.     diff3(p, q, d);
  83.     return length3(d);
  84. }
  85.  
  86. void copy3(float old[3], float new[3])
  87. {
  88.     new[0] = old[0], new[1] = old[1], new[2] = old[2];
  89. }
  90.  
  91. void crossprod(float v1[3], float v2[3], float prod[3])
  92. {
  93.     float p[3];    /* in case prod == v1 or v2 */
  94.  
  95.     p[0] = v1[1]*v2[2] - v2[1]*v1[2];
  96.     p[1] = v1[2]*v2[0] - v2[2]*v1[0];
  97.     p[2] = v1[0]*v2[1] - v2[0]*v1[1];
  98.     prod[0] = p[0]; prod[1] = p[1]; prod[2] = p[2];
  99. }
  100.  
  101. void normalize(float v[3])
  102. {
  103.     float d;
  104.  
  105.     d = sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
  106.     if (d == 0.0) {
  107.         error("normalize: zero length vector");
  108.     v[0] = d = 1.0;
  109.     }
  110.     d = 1/d;
  111.     v[0] *= d; v[1] *= d; v[2] *= d;
  112. }
  113.  
  114. void print3(float v[3])
  115. {
  116.     float len;
  117.  
  118.     len = length3(v);
  119.     printf("(%g %g %g); len: %g\n", v[0], v[1], v[2], len);
  120. }
  121.  
  122. void printmat3(float m[3][3])
  123. {
  124.     int i, j;
  125.  
  126.     for (i=0; i<3; i++) {
  127.     for (j=0; j<3; j++)
  128.         printf("%7.4f  ", m[i][j]);
  129.     printf("\n");
  130.     }
  131. }
  132.  
  133. void identifymat3(float m[3][3])
  134. {
  135.     int i, j;
  136.  
  137.     for (i=0; i<3; i++)
  138.     for (j=0; j<3; j++)
  139.         m[i][j] = (i == j) ? 1.0 : 0.0;
  140. }
  141.  
  142. void copymat3(float *to, float *from)
  143. {
  144.     int i;
  145.  
  146.     for (i=0; i<9; i++) {
  147.     *to++ = *from++;
  148.     }
  149. }
  150.  
  151. void xformvec3(float v[3], float m[3][3], float vm[3])
  152. {
  153.     float result[3];    /* in case v == vm */
  154.     int i;
  155.  
  156.     for (i=0; i<3; i++) {
  157.     result[i] = v[0]*m[0][i] + v[1]*m[1][i] + v[2]*m[2][i];
  158.     }
  159.     for (i=0; i<3; i++) {
  160.     vm[i] = result[i];
  161.     }
  162. }
  163.  
  164. long samepoint(float p1[3], float p2[3])
  165. {
  166.     if (p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2])
  167.     return 1;
  168.     return 0;
  169. }
  170.  
  171. void perpnorm(float p1[3], float p2[3], float p3[3], float n[3])
  172. {
  173.     float d1[3], d2[3];
  174.  
  175.     diff3(p2, p1, d1);
  176.     diff3(p2, p3, d2);
  177.     crossprod(d1, d2, n);
  178.     normalize(n);
  179. }
  180.  
  181.